//      Copyright (c) Microsoft Corporation. All rights reserved.
#pragma once

// defining the abstract interface for Windows SideShow device hardware-specific code

#include <stddef.h>
#include <windows.h>
#include <winspool.h>
#include <winddiui.h>
#include <commctrl.h>
#include <commdlg.h>
#include <compstui.h>
#include <shlwapi.h>
#include <strsafe.h>
#include <atlbase.h>
#include "Common.h"

class CSideShowButtonEventSink;

class CSideShowHW
{
public:
    virtual ~CSideShowHW() = 0;
    virtual HRESULT Initialize(PCWSTR Instance, CSideShowButtonEventSink* pBtnEventSink) = 0;
    virtual HRESULT GetCaps(ULONG* pWidth, ULONG* pHeight, ULONG* pDepth) = 0;
    virtual HRESULT DisplayBitmap(const BYTE* pbBitmapData, DWORD cbBitmapData, DWORD dwRenderFlags) = 0;
};

class CSideShowButtonEventSink
{
public:
    virtual void OnButton(CDevice::DeviceEvent buttonEvent);
};

// the entry of SideShow hardware-specific code
CSideShowHW* CreateSideShowHW();